package fpt.edu.vn.util;

/* 
 * FuzzyLogic.java 
 *  
 * 0.1
 * 
 * 10/15/2012 
 *  
 * Copyright notice 
 *  
 * Modification Logs: 
 *   DATE        AUTHOR      DESCRIPTION 
 *  -------------------------------------------------------- 
 *  15-Oct-2012  ThuongND    Create new 
 */
public class FuzzyLogic {

	// Chi phí dành cho nhà trọ
	// 0 -> 1 Thấp

	// 1 -> 2 (khoảng mờ giữa thấp và tb)

	// 2 -> 3.5 TB

	// 3.5 -> 5(khoảng mờ giữa tb và cao)

	// > 5 Cao

	// Diện tích
	// 0 -> 10m2 Hẹp

	// 10 -> 15m2(Khoảng mờ giữa hẹp và tb)

	// 15 -> 20m2 TB

	// 20 -> 30m2(Khoảng mờ giữa tb và rộng)

	// >30m2 Rộng

	// Số người ở
	// 1 Ít
	// 2 Ít

	// 3 TB

	// 4 Nhiều
	// 5 Nhiều

	// Luật suy diễn (Chi phí ở khoảng nào thì chọn khoảng đó)

	// Chi phí + Số người ở ---> diện tích
	// Ít + Ít ---> maxSsmal/2 -> max
	// Ít + tb ---> maxSsmal/2+5 -> max
	// Ít + nhiều ---> maxSsmal/2+10 -> max

	// Ít->tb + Ít ---> 0.8*S -> max
	// Ít->tb + tb ---> 1.2*S -> max
	// Ít->tb + nhiều ---> 1.4*S -> max

	// Tb + Ít ---> MIN Snormal -> max
	// Tb + Tb ---> MIN Snormal+5 ->max
	// Tb + Nhiều ---> MIN Snormal+10 -> max

	// TB->cao + ít --> 0.8*S -> max
	// TB->cao + tb --> 1.2*S -> max
	// TB->cao + nhiều --> 1.4*S -> max

	// Cao + ít --> MIN Slarge -> max
	// Cao + tb --> MIN Slarge+5 -> max
	// Cao + nhiều --> MIN Slarge+10 -> max
	
	public String[] fuzzification(double moneyForLease, int numberPerson) {
		String[] fuzzi = new String[3];

		if (moneyForLease <= 1) {
			fuzzi[0] = "little";
			fuzzi[1] = "1";
		}
		if (moneyForLease > 1 && moneyForLease < 2) {
			fuzzi[0] = "little_normal";
			fuzzi[1] = "" + (2 - moneyForLease);
		}
		if (moneyForLease >= 2 && moneyForLease <= 3.5) {
			fuzzi[0] = "normal";
			fuzzi[1] = "1";
		}
		if (moneyForLease > 3.5 && moneyForLease < 5) {
			fuzzi[0] = "normal_high";
			fuzzi[1] = "" + (5 - moneyForLease) / 1.5;
		}
		if (moneyForLease >= 5) {
			fuzzi[0] = "high";
			fuzzi[1] = "1";
		}
		if (numberPerson == 1 || numberPerson == 2) {
			fuzzi[2] = "plittle";
		}
		if (numberPerson == 3) {
			fuzzi[2] = "pnormal";
		}
		if (numberPerson == 4 || numberPerson == 5) {
			fuzzi[2] = "pmany";
		}
		return fuzzi;

	}

	public double[] rule_defuzzification(String fuzzi1, String fuzzi2,
			String fuzzi3) {
		double[] output = new double[3];

		// Số tiền chi tiêu thấp
		if (fuzzi1.equalsIgnoreCase("little")
				&& fuzzi3.equalsIgnoreCase("plittle")) {
			output[0] = 0;
			output[1] = 1;// triệu
			output[2] = 5;// m2
		}
		if (fuzzi1.equalsIgnoreCase("little")
				&& fuzzi3.equalsIgnoreCase("pnormal")) {
			output[0] = 0;
			output[1] = 1;// triệu
			output[2] = 10;// m2
		}
		if (fuzzi1.equalsIgnoreCase("little")
				&& fuzzi3.equalsIgnoreCase("pmany")) {
			output[0] = 0;
			output[1] = 1;// triệu
			output[2] = 15;// m2
		}

		// Số tiền chi tiêu khoảng mờ thấp và tb
		if (fuzzi1.equalsIgnoreCase("little_normal")
				&& fuzzi3.equalsIgnoreCase("plittle")) {
			output[0] = 1;
			output[1] = 2;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 10 + 5 * (1 - percent);
			output[2] = 0.8 * s;// m2
		}
		if (fuzzi1.equalsIgnoreCase("little_normal")
				&& fuzzi3.equalsIgnoreCase("pnormal")) {
			output[0] = 1;
			output[1] = 2;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 10 + 5 * (1 - percent);
			output[2] = 1.2 * s;// m2
		}
		if (fuzzi1.equalsIgnoreCase("little_normal")
				&& fuzzi3.equalsIgnoreCase("pmany")) {
			output[0] = 1;
			output[1] = 2;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 10 + 5 * (1 - percent);
			output[2] = 1.4 * s;// m2
		}

		// Số tiền chi tiêu trung bình
		if (fuzzi1.equalsIgnoreCase("normal")
				&& fuzzi3.equalsIgnoreCase("plittle")) {
			output[0] = 2;
			output[1] = 3.5;// triệu
			output[2] = 15;// m2
		}
		if (fuzzi1.equalsIgnoreCase("normal")
				&& fuzzi3.equalsIgnoreCase("pnormal")) {
			output[0] = 2;
			output[1] = 3.5;// triệu
			output[2] = 20;// m2
		}
		if (fuzzi1.equalsIgnoreCase("normal")
				&& fuzzi3.equalsIgnoreCase("pmany")) {
			output[0] = 2;
			output[1] = 3.5;// triệu
			output[2] = 25;// m2
		}

		// Số tiền chi tiêu giữa khoảng mờ trung bình và cao
		if (fuzzi1.equalsIgnoreCase("normal_high")
				&& fuzzi3.equalsIgnoreCase("plittle")) {
			output[0] = 3.5;
			output[1] = 5;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 20 + 10 * (1 - percent);
			output[2] = 0.8 * s;// m2
		}
		if (fuzzi1.equalsIgnoreCase("normal_high")
				&& fuzzi3.equalsIgnoreCase("pnormal")) {
			output[0] = 3.5;
			output[1] = 5;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 20 + 10 * (1 - percent);
			output[2] = 1.2 * s;// m2
		}
		if (fuzzi1.equalsIgnoreCase("normal_high")
				&& fuzzi3.equalsIgnoreCase("pmany")) {
			output[0] = 3.5;
			output[1] = 5;// triệu

			double percent = Double.parseDouble(fuzzi2);
			double s = 20 + 10 * (1 - percent);
			output[2] = 1.4 * s;// m2
		}
		// Số tiền chi tiêu cao
		if (fuzzi1.equalsIgnoreCase("high")
				&& fuzzi3.equalsIgnoreCase("plittle")) {
			output[0] = 5;
			output[1] = 5;// triệu
			output[2] = 20;// m2
		}
		if (fuzzi1.equalsIgnoreCase("high")
				&& fuzzi3.equalsIgnoreCase("pnormal")) {
			output[0] = 5;
			output[1] = 5;// triệu
			output[2] = 25;// m2
		}
		if (fuzzi1.equalsIgnoreCase("high") && fuzzi3.equalsIgnoreCase("pmany")) {
			output[0] = 5;
			output[1] = 5;// triệu
			output[2] = 30;// m2
		}
		return output;
	}
}
